const express = require('express');
const axios = require('axios');
// const axios = require('./public/js/axios');
const cors = require('cors');
const myHttp = require('./myHttp');
const app = express();
const PORT = 9191;

// 允许所有跨域请求
app.use(cors({
  "origin": '*', //true 设置为 req.origin.url
  "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", //容许跨域的请求方式
  "allowedHeaders": "x-requested-with,Authorization,token,content-type", //跨域请求头
  "preflightContinue": false, // 是否通过next() 传递options请求 给后续中间件 
  "maxAge": 1728000, //options预验结果缓存时间 20天
  "credentials": true, //携带cookie跨域
  "optionsSuccessStatus": 200 //options 请求返回状态码
}))

app.use(express.static('public')); // 可选：用于服务静态文件（如 HTML 页面）

app.use((req, res, next) => {
  next();
});

app.all('*', async (req, res) => {

  let targetUrl = decodeURIComponent(req.originalUrl.substring(1))
  // if (!targetUrl.trim()) return;
  try {
    new URL(targetUrl)
  } catch (error) {
    res.status(201).send('需要正确的url');
    console.log(`url不正确`, targetUrl)
    return;
  }
  console.log(`请求url：`, req.method, targetUrl)

  try {
    // 处理 POST 请求的 body（如果是 JSON 或表单数据）
    let axiosConfig = {};
    if (req.method === 'POST') {
      const bodyFormData = new FormData();
      for (let [key, value] of Object.entries(req.body)) {
        bodyFormData.append(key, value);
      }
      axiosConfig = {
        method: 'POST',
        headers: { ...req.headers, ...bodyFormData.getHeaders() },
        data: bodyFormData,
      };
    } else if (req.method !== 'GET' && req.body) {
      // 对于非 GET 请求且包含 body 的情况，假设 body 是 JSON 格式
      axiosConfig = {
        method: req.method,
        headers: { ...req.headers, 'Content-Type': 'application/json' },
        data: JSON.stringify(req.body),
      };
    } else {
      delete req.headers['host']
      delete req.headers['referer']
      axiosConfig = { headers: { ...req.headers }, method: req.method };
      // console.log(`req.headers`, req.headers)
    }

    // 如果不是 POST 请求或者我们已经处理了 POST 请求的 body，则直接使用原始 URL
    if (req.method === 'GET' || axiosConfig.data) {
      targetUrl = new URL(targetUrl).href; // 确保 URL 是完整的（包括查询参数）
    }

    myHttp.sendRequest(targetUrl, { ...axiosConfig }, (error, response) => {
      if (!error) {
        console.log(response.status, req.method, targetUrl)
        // 设置响应头并发送响应数据
        res.set(response.headers);
        // delete res.headers['transfer-encoding']; // 删除可能的 'chunked' 编码头
        res.status(response.status).send(response.data);
      }
      else {
        console.log(`sendRequest ===== `, error.status || 100001, JSON.stringify({
          req_url: targetUrl,
          req_method: req.method,
          error_name: error.name,
          error_message: error.message,
          error_status: error.status,
          error: error.errno,
          error_code: error.code,
        }, null, 4))
        res.status(error.status || 404).send(['抱歉，你需要的中转请求没有成功，详细信息如下1~~', error]);
      }
    });

  } catch (error) {
    console.log(`未知异常`,)
    res.status(error.status || 404).send(['抱歉，你需要的中转请求没有成功，详细信息如下~~', error]);
  }
});

// 中间件来解析 JSON 和 URL 编码的表单数据
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// 注意：对于多部分表单数据（文件上传），你可能需要使用 `multer` 或类似的中间件
// 并在上面的 POST 请求处理逻辑中进行相应的调整。

app.listen(PORT, () => {
  console.log(`Universal proxy server is running on port http://localhost:${PORT}`);
});
